import tkinter as tk
from tkinter import ttk, messagebox
import sqlite3
import csv
from tkcalendar import DateEntry
from tkinter import StringVar, IntVar

def run_card():
    global root
    root = tk.Tk()
    root.title("Протокол экспертизы медицинской карты")  # Добавьте эту строку
    # Создание базы данных
    conn = sqlite3.connect('expertise.db')
    c = conn.cursor()
    c.execute("""CREATE TABLE IF NOT EXISTS form_data (
                ФИО text,
                Год_госпитализации text,
                Проведено_дней integer,
                Отделение text,
                Пол text,
                Дата_рождения text,
                Возраст integer,
                Область_проживания text,
                Район_проживания text,
                Тип_пункта text,
                Населенный_пункт text,
                Профессия text,
                Инвалидность text,
                Кем_направлен text,
                Жалобы_на text,
                Считает_себя_больным text,
                Куда_обращался text,
                Вредные_привычки text,
                Тип_образования text,
                Лимфатические_узлы text,
                Диагноз_МКБ text,
                TNM text,
                Сопутствующие text,
                Госпитализирован_в_году integer,
                Лечение text,
                Гистология text

                )""")
    conn.commit()
    def clear_fields():
        global root
        for field in fields.values():
            if isinstance(field, (tk.Entry, ttk.Combobox)):
                field.delete(0, 'end')
            elif isinstance(field, tk.IntVar):
                field.set(0)
        for field in tnm_fields.values():
            if isinstance(field, (tk.Entry, ttk.Combobox)):
                field.delete(0, 'end')
            elif isinstance(field, tk.IntVar):
                field.set(0)
        # Добавлено: обнуление чекбоксов
        for checkbox_var in [complaints, livingtypes, habits, typelesions, supportives, treatments]:
            for var in checkbox_var.values():
                var.set(0)
    def submit_data():
        global root  # Добавьте эту строку
            # Получение выбранных жалоб
        selected_complaints = [complaint for complaint, var in complaints.items() if var.get()]
        selected_livingtypes = [livingtype for livingtype, var in livingtypes.items() if var.get()]
        selected_habits = [habit for habit, var in habits.items() if var.get()]
        selected_typelesions = [typelesion for typelesion, var in typelesions.items() if var.get()]
        selected_supportives = [supportive for supportive, var in supportives.items() if var.get()]
        selected_treatments = [treatment for treatment, var in treatments.items() if var.get()]
        tnm = 'T' + tnm_fields['T'].get() + 'N' + tnm_fields['N'].get() + 'M' + tnm_fields['M'].get()
        conn = sqlite3.connect('expertise.db')
        c = conn.cursor()
        c.execute("""
        INSERT INTO form_data 
        (ФИО, Год_госпитализации, Проведено_дней, Отделение, Пол, Дата_рождения, Возраст, Область_проживания, Район_проживания, Тип_пункта, Населенный_пункт, Профессия, Инвалидность, Кем_направлен, Жалобы_на, Считает_себя_больным, Куда_обращался, Вредные_привычки, Тип_образования, Лимфатические_узлы, Диагноз_МКБ, TNM, Сопутствующие, Госпитализирован_в_году, Лечение, Гистология) 
        VALUES 
        (:ФИО, :Год_госпитализации, :Проведено_дней, :Отделение, :Пол, :Дата_рождения, :Возраст, :Область_проживания, :Район_проживания, :Тип_пункта, :Населенный_пункт, :Профессия, :Инвалидность, :Кем_направлен, :Жалобы_на, :Считает_себя_больным, :Куда_обращался, :Вредные_привычки, :Тип_образования, :Лимфатические_узлы, :Диагноз_МКБ, :TNM, :Сопутствующие, :Госпитализирован_в_году, :Лечение, :Гистология)
        """,
                {
                    'ФИО': fields['Фамилия Имя Отчество'].get(),
                    'Год_госпитализации': fields['Год госпитализации'].get(),
                    'Проведено_дней': int(fields['Проведено койко-дней'].get()),
                    'Отделение': fields['Отделение'].get(),
                    'Пол': fields['Пол'].get(),
                    'Дата_рождения': fields['Дата рождения'].get(),
                    'Возраст': int(fields['Возраст'].get()),
                    'Область_проживания': fields['Область проживания'].get(),
                    'Район_проживания': fields['Район проживания'].get(),
                    'Тип_пункта': ', '.join(selected_livingtypes),
                    'Населенный_пункт': fields['Населенный пункт'].get(),
                    'Профессия': fields['Профессия'].get(),
                    'Инвалидность': fields['Инвалидность'].get(),
                    'Кем_направлен': fields['Кем направлен'].get(),
                    'Жалобы_на': ', '.join(selected_complaints),
                    'Считает_себя_больным': fields['Считает себя больным в течение'].get(),
                    'Куда_обращался': fields['К какому специалисту обращался'].get(),
                    'Вредные_привычки': ', '.join(selected_habits),
                    'Тип_образования': ', '.join(selected_typelesions),
                    'Лимфатические_узлы': fields['Лимфатические узлы'].get(),
                    'Диагноз_МКБ': fields['Диагноз (МКБ-10)'].get(),
                    'TNM': tnm,
                    'Сопутствующие': ', '.join(selected_supportives),
                    'Госпитализирован_в_году': int(fields['Госпитализирован в этом году (который раз)'].get()),
                    'Лечение': ', '.join(selected_treatments),
                    'Гистология': fields['Гистология'].get()
                })
        conn.commit()
        conn.close()
        
        # Создание нового окна
        new_window = tk.Toplevel(root)
        new_window.title("Данные отправлены")
        tk.Label(new_window, text="Данные отправлены!").pack()
        tk.Button(new_window, text="Следующий пациент", command=lambda: [clear_fields(), new_window.destroy()]).pack()
        tk.Button(new_window, text="Выход", command=root.quit).pack()


    def export_to_csv():
        conn = sqlite3.connect('expertise.db')
        c = conn.cursor()
        data = c.execute("SELECT * FROM form_data").fetchall()
        field_names = [description[0] for description in c.description]
        with open('expertise.csv', 'w', newline='') as file:
            writer = csv.writer(file)
            writer.writerow(field_names)
            writer.writerows(data)
        conn.close()

    submit_button = tk.Button(root, text="Отправить", command=submit_data)
    export_button = tk.Button(root, text="Экспорт в CSV", command=export_to_csv)
    # Создание списков
    mkb_options = ["C00.0 Злокачественное новообразование наружной поверхности верхней губы", "C00.1 Злокачественное новообразование наружной поверхности нижней губы", "C00.2 Злокачественное новообразование наружной поверхности губы неуточненной", "C00.3 Злокачественное новообразование внутренней поверхности верхней губы", "C00.4 Злокачественное новообразование внутренней поверхности нижней губы", "C00.5 Злокачественное новообразование внутренней поверхности губы неуточненной", 
                "C00.6 Злокачественное новообразование спайки губы", "C00.8 Злокачественное новообразование губы, выходящее за пределы одной и более вышеуказанных локализаций", "C00.9 Злокачественное новообразование губы неуточненной части", "C01 Злокачественные новообразования основания языка", "C02.0 Злокачественное новообразование спинки языка", "C02.1 Злокачественное новообразование боковой поверхности языка", "C02.2 Злокачественное новообразование нижней поверхности языка",
                "C02.3 Злокачественное новообразование передних 2/3 языка неуточненной части", "C02.4 Злокачественное новообразование язычной миндалины", "C02.8 Злокачественное новообразование языка, выходящее за пределы одной и более вышеуказанных локализаций", "C02.9 Злокачественное новообразование языка неуточненной части", "C03.0 Злокачественное новообразование десны верхней челюсти", "C03.1 Злокачественное новообразование десны нижней челюсти",
                "C03.9 Злокачественное новообразование десны неуточненной", "C04.0 Злокачественное новообразование передней части дна полости рта", "C04.1 Злокачественное новообразование боковой части дна полости рта", "C04.8 Злокачественное новообразование дна полости рта, выходящее за пределы одной и более вышеуказанных локализаций",
                "C04.9 Злокачественное новообразование дна полости рта, неуточненное", "C05.0 Злокачественное новообразование твердого неба", "C05.1 Злокачественное новообразование мягкого неба", "C05.2 Злокачественное новообразование язычка", "C05.8 Злокачественное новообразование неба, выходящее за пределы одной и более вышеуказанных локализаций",
                "C05.9 Злокачественное новообразование неба, неуточненное", "C06.0 Злокачественное новообразование слизистой оболочки щеки", "C06.1 Злокачественное новообразование преддверия рта", "C06.2 Злокачественное новообразование ретромолярной области", "C06.8 Злокачественное новообразование других и неуточненных отделов рта, выходящее за пределы одной и более вышеуказанных локализаций", "C06.9 Злокачественное новообразование рта неуточненное", "C07 Злокачественное новообразование околоушной слюнной железы",
                "C08.0 Злокачественное новообразование поднижнечелюстной железы", "C08.1 Злокачественное новообразование подъязычной железы", "C08.8 Злокачественное новообразование больших слюнных желез, выходящее за пределы одной и более вышеуказанных локализаций", "C08.9 Злокачественное новообразование большой слюнной железы неуточненной", "C09.0 Злокачественное новообразование миндаликовой ямочки", "C09.1 Злокачественное новообразование дужки небной миндалины (передней) (задней)", "C09.8 Злокачественное новообразование миндалины, выходящее за пределы одной и более вышеуказанных локализаций",
                "C09.9 Злокачественное новообразование миндалины неуточненной", "C14.8 Злокачественное новообразование губы, полости рта и глотки, выходящее за пределы одной и более вышеуказанных локализаций", "D11.0 Доброкачественное новообразование околоушной слюнной железы", "D11.7 Доброкачественное новообразование других больших слюнных желез", "D11.9 Доброкачественное новообразование большой слюнной железы неуточненное"]
    sex = ["Мужской", "Женский"]
    states = ["Рязанская область",
    "Алтайский край",
    "Краснодарский край",
    "Красноярский край",
    "Приморский край",
    "Ставропольский край",
    "Хабаровский край",
    "Амурская область",
    "Архангельская область",
    "Астраханская область",
    "Белгородская область",
    "Брянская область",
    "Владимирская область",
    "Волгоградская область",
    "Вологодская область",
    "Воронежская область",
    "Ивановская область",
    "Иркутская область",
    "Калининградская область",
    "Калужская область",
    "Камчатский край",
    "Кемеровская область - Кузбасс",
    "Кировская область",
    "Костромская область",
    "Курганская область",
    "Курская область",
    "Ленинградская область",
    "Липецкая область",
    "Магаданская область",
    "Московская область",
    "Мурманская область",
    "Нижегородская область",
    "Новгородская область",
    "Новосибирская область",
    "Омская область",
    "Оренбургская область",
    "Орловская область",
    "Пензенская область",
    "Пермский край",
    "Псковская область",
    "Республика Адыгея",
    "Республика Башкортостан",
    "Республика Бурятия",
    "Республика Алтай",
    "Республика Дагестан",
    "Республика Ингушетия",
    "Кабардино-Балкарская Республика",
    "Республика Калмыкия",
    "Республика Хакасия",
    "Карачаево-Черкесская Республика",
    "Республика Карелия",
    "Республика Коми",
    "Республика Марий Эл",
    "Республика Мордовия",
    "Республика Саха (Якутия)",
    "Республика Северная Осетия - Алания",
    "Республика Татарстан (Татарстан)",
    "Республика Тыва",
    "Ростовская область",
    "Самарская область",
    "Саратовская область",
    "Сахалинская область",
    "Свердловская область",
    "Смоленская область",
    "Тамбовская область",
    "Тверская область",
    "Томская область",
    "Тульская область",
    "Тюменская область",
    "Ульяновская область",
    "Челябинская область",
    "Забайкальский край",
    "Ярославская область",
    "г. Москва",
    "г. Санкт-Петербург",
    "Еврейская автономная область",
    "Ненецкий автономный округ",
    "Ханты-Мансийский автономный округ - Югра",
    "Чукотский автономный округ",
    "Удмуртская Республика",
    "Чеченская Республика",
    "Чувашская Республика - Чувашия",
    "Ямало-Ненецкий автономный округ",
    "Республика Крым",
    "г. Севастополь",
    "иные территории, включая город и космодром Байконур"]
    ryazanstates = ["Александро-Невский", "Ермишинский", "Захаровский", "Кадомский", "Касимовский", "Клепиковский", "Кораблинский", "Милославский", "Михайловский", "Пителинский", "Пронский", "Путятинский", "Рыбновский", "Ряжский", "Рязанский", "Сапожковский", "Сараевский", "Сасовский", "Скопинский", "Спасский", "Старожиловский", "Ухоловский", "Чучковский", "Шацкий", "Шиловский"]
    majorcities = ["Рязань", "Москва", "Александро-Невский", "Ермишь", "Захарово", "Кадом", "Касимов", "Спас-Клепики", "Кораблино", "Милославское", "Михайлов", "Пителино", "Пронск", "Путятино", "Рыбное", "Ряжск", "Сапожок", "Сараи", "Сасово", "Скопин", "Спасск-Рязанский", "Старожилово", "Ухолово", "Чучково", "Шацк", "Шилово"]
    appointer = ["Врач-стоматолог", "Специалист другого профиля"]
    lymphaticnodesstate = ["Пальпаторно не определяются", "Увеличены"]
    issickfor = ["Менее 6 месяцев", "От 6 месяцев до 1 года", "Более одного года"]
    hystology = ["Плоскоклеточный рак"]
    handicap = ["I", "II", "III"]
    # Создание меток и полей ввода
    fields = {
        'Фамилия Имя Отчество': tk.Entry(root, width=80),
        'Год госпитализации': tk.Entry(root, width=80),
        'Проведено койко-дней': tk.Entry(root, width=80),
        'Отделение': tk.Entry(root, width=80),
        'Пол': ttk.Combobox(root, width=80, values=sex),
        'Дата рождения': DateEntry(root, width=80),
        'Возраст': tk.Entry(root, width=80),
        'Область проживания': ttk.Combobox(root, width=80, values = states),
        'Район проживания': ttk.Combobox(root, width=80, values = ryazanstates),
        'Тип населенного пункта': None,
        'Населенный пункт': ttk.Combobox(root, width=80, values = majorcities),
        'Профессия': tk.Entry(root, width=80),
        'Инвалидность': ttk.Combobox(root, width=80, values = handicap),
        'Кем направлен': tk.Entry(root, width=80),
        'Жалобы на наличие': None,  # Изменено здесь
        'Считает себя больным в течение': ttk.Combobox(root, width=80, values = issickfor),
        'К какому специалисту обращался': ttk.Combobox(root, width=80, values = appointer),
        'Вредные привычки': None,  # Изменено здесь
        'Тип образования': None,  # Изменено здесь
        'Лимфатические узлы': ttk.Combobox(root, width=80, values = lymphaticnodesstate),
        'Диагноз (МКБ-10)': ttk.Combobox(root, width=80, values = mkb_options),
        'Стадия TNM': None,  # Изменено здесь
        'Сопутствующие': None,  # Изменено здесь
        'Госпитализирован в этом году (который раз)': tk.Entry(root, width=80),
        'Лечение': None,  # Изменено здесь
        'Гистология': ttk.Combobox(root, width=80, values = hystology)
    }
    tnm_fields = {  # Добавлено здесь
        'T': tk.Entry(root),
        'N': tk.Entry(root),
        'M': tk.Entry(root)
    }

    # Создание переменных для чекбоксов
    livingtypes = {
        'Город': tk.IntVar(),
        'Село': tk.IntVar(),
        'Деревня': tk.IntVar(),
        'Поселок городского типа': tk.IntVar(),
        'Станица': tk.IntVar()
    }
    habits = {
        'Курение': tk.IntVar(),
        'Алкоголь': tk.IntVar()
    }
    typelesions = {
        'Язва': tk.IntVar(),
        'Образование': tk.IntVar(),
        'Рубец': tk.IntVar()
    }
    supportives = {
        'ИБС': tk.IntVar(),
        'Гипертоническая болезнь': tk.IntVar(),
        'Хронический гастрит': tk.IntVar(),
        'Хронический холицестит': tk.IntVar(),
        'Хронический панкреатит': tk.IntVar(),
        'Язвенная болезнь желудка и двенадцатиперстной кишки': tk.IntVar(),
        'Сахарный диабет': tk.IntVar()
    }
    treatments = {
        'Хирургическое': tk.IntVar(),
        'Дистанционная гамма-терапия': tk.IntVar(),
        'Рентгенотерапия': tk.IntVar(),
        'Быстрые электроны': tk.IntVar(),
        'Контактная гамма-терапия и глубокая рентгенотерапия': tk.IntVar(),
        'Хирургическое и гамма-терапия': tk.IntVar(),
        'Хирургическое и рентгенотерапия': tk.IntVar(),
        'Хирургическое и сочетанное лучевое': tk.IntVar(),
        'Химиопрепаратами': tk.IntVar(),
        'Гормональными препаратами': tk.IntVar(),
        'Паллиативное': tk.IntVar(),
        'Симптоматическое лечение': tk.IntVar()
    }
    complaints = {
        'Образование': tk.IntVar(),
        'Язва': tk.IntVar(),
        'Увеличенный лимфоузел': tk.IntVar(),
        'Боль': tk.IntVar(),
        'Слабость': tk.IntVar()
    }
    extra_rows = 0
    checkbox_fields = ['Жалобы на наличие', 'Тип населенного пункта', 'Вредные привычки', 'Тип образования', 'Сопутствующие', 'Лечение']
    checkbox_vars = [complaints, livingtypes, habits, typelesions, supportives, treatments]
    checkboxes_per_row = [4, 4, 4, 4, 4, 4]  # Можно настроить количество чекбоксов в строке для каждого поля

    for i, (label_text, entry) in enumerate(fields.items()):
        label = tk.Label(root, text=label_text)
        label.grid(row=i + extra_rows, column=0)
        if label_text in checkbox_fields:
            checkbox_index = checkbox_fields.index(label_text)
            checkbox_var = checkbox_vars[checkbox_index]
            checkbox_per_row = checkboxes_per_row[checkbox_index]
            checkbox_row = 0
            checkbox_col = 0
            for j, (checkbox_label, var) in enumerate(checkbox_var.items()):
                tk.Checkbutton(root, text=checkbox_label, variable=var).grid(row=i + checkbox_row + extra_rows, column=checkbox_col+1)
                checkbox_col += 1
                if checkbox_col >= checkbox_per_row:
                    checkbox_col = 0
                    checkbox_row += 1
            extra_rows += checkbox_row
        elif label_text == 'Стадия TNM':
            for j, (tnm_label, tnm_entry) in enumerate(tnm_fields.items(), start=2):
                tk.Label(root, text=tnm_label).grid(row=i + extra_rows, column=j-1,  padx=10, pady=10)
                tnm_entry.grid(row=i + extra_rows, column=j-1, padx=10, pady=10)
        elif entry is not None:  # Проверка на None
            if isinstance(entry, tk.IntVar):
                tk.Checkbutton(root, text=label_text, variable=entry).grid(row=i + extra_rows, column=1)
            else:
                entry.grid(row=i + extra_rows, column=1)

    # Переместите кнопки в конец
    submit_button.grid(row=i + extra_rows + 1, column=2, columnspan=2)
    export_button.grid(row=i + extra_rows + 2, column=2, columnspan=2)

    root.mainloop()



